package main

import (
	"fmt"
)

func main() {
	/*
		1.函数的参数：
			形式参数：也叫形参，函数定义的时候，用于接受外部传入的数据的变量
				函数中，某些变量的数值无法确定，需要由外部传入数据

			实际参数：也叫实参，函数调用的时候，给形参赋值的实际的数据

		2.函数调用：
			1.函数名：声明的函数名和调用的函数名要统一
			2.实参必须严格匹配形参：顺序，个数，类型，一一对应的。

		3.函数支持有名返回值，参数名就相当于函数体内最外层的局部变量，
			命名返回值变量会被初始化为类型零值，最后 return 可以不带参数名直接返回
		注：
			1.不允许在函数体内声明与返回值同名的变量
			2.当我们的一个函数返回值类型为 slice 时，nil 可以看做是一个有效的 slice，没有必要返回一个长度为 0 的切片。
	*/
	//1.求1~10的和
	getSum1(10)
	//2.求1~20的和
	getSum1(20)

	getAdd(1, 9)
	getAdd2(1, 9)
	fun1(1.3, 2.5, "Hello World")

	fmt.Println(add0(1, 2))
}

// 定义一个函数，用于求1~10的和（也可以将函数放在主函数的上面）
func getSum1(n int) {
	sum := 0
	for i := 1; i <= n; i++ {
		sum += i
	}
	fmt.Printf("1~%d的和为：%d\n", n, sum)
}

// 求两个数的和
func getAdd(a int, b int) {
	fmt.Printf("%d + %d = %d\n", a, b, a+b)
}

// 参数类型一致，可以简写在一起
func getAdd2(a, b int) {
	fmt.Printf("%d + %d = %d\n", a, b, a+b)
}

func fun1(a, b float64, c string) {
	fmt.Printf("a: %f, b: %f, c: %s\n", a, b, c)
}

// 有名返回值
func add0(a, b int) (sum int) {
	sum = a + b
	return //return sum 的简写模式
}
